pub fn min_edge_prime_num(number: u32) -> String {
    let number = number as u128;
    let mut edge = 1;
    let mut cnt = 0;
    loop {
        edge += 2;
        let pow_edge = edge * edge;
        let nums = [pow_edge - 3 * edge + 3, pow_edge - 2 * edge + 2, pow_edge - edge + 1];
        for num in nums {
            if miller_rabin(num) {
                cnt += 1;
            }
        }
        let all = edge / 2 * 4 + 1;
        if all * number > cnt * 100 {
            return format!("{},{}", edge, cnt);
        }
    }
}

fn quick_pow(mut a: u128, mut b: u128, m: u128) -> u128 {
    let mut res = 1;
    while b != 0 {
        if (b & 1) != 0 { res = res * a % m }
        a = a * a % m;
        b >>= 1;
    }
    res
}

fn miller_rabin(p: u128) -> bool {
    if p < 2 { return false; }
    if p == 2 { return true; }
    if p == 3 { return true; }
    let mut d = p - 1;
    let mut r = 0;
    while d & 1 == 0 {
        r += 1;
        d >>= 1;
    }
    for _ in 0..6 {
        let a = fastrand::u128(..p - 2) + 2;
        let mut x = quick_pow(a, d, p);
        if x == 1 || x == p - 1 { continue; }
        for _ in 0..r - 1 {
            x = x * x % p;
            if x == p - 1 { break; }
        }
        if x != p - 1 { return false; }
    }
    true
}